package com.zhihaoliang.room.data

import androidx.room.*

/**
 * @author 支豪亮
 * @date 2023/1/30 14:42
 * @des 支持全文搜索
 *
 * 全文搜索是从文本或数据库中，不限定数据字段自由地搜索出信息的技术。
 * 它的工作原理是扫描文章中的每一个词，对每一个词建立一个索引，指明该词在文章中出现的次数和位置，当进行查询时，
 * 数据库就根据事先建立的索引进行查找，从而大幅度加快查找速度
 *
 * 当时文件的插入速度会变慢
 * 数据量不大时 like 语句更快
 */
@Fts4
@Entity(tableName = "users_fts")
data class UserFts(
    /**
     *  Specifying a primary key for an FTS-table-backed entity is optional
     *  but if you include one, it must use this type and column name.
     *
     *  FTS 的实体类主键是可选的，如果设置了它的列名需要是 rowid
     *
     *  如果设置了 rowid 搜索时需要
     *  "SELECT * ,`rowid`FROM users_fts WHERE last_name MATCH '1*'"
    */
    @PrimaryKey val rowid: Int,
    @ColumnInfo(name = "last_name") val lastName: String?,
    @ColumnInfo(name = "first_name") val firstName: String?,
)

@Dao
interface UserFtsDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAll(users: List<UserFts>)

    @Query("SELECT * ,`rowid`FROM users_fts WHERE last_name MATCH '1*'")
    suspend fun queryMatchUsers() :List<UserFts>

    @Query("SELECT *,`rowid` FROM users_fts WHERE last_name LIKE '%1%'")
    suspend fun queryLikeUsers() :List<User>
}